package p4;

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.List;
import java.awt.Panel;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.rmi.Naming;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;



public class ChatCliente extends UnicastRemoteObject implements
		ChatClienteInterface, ActionListener {

	private static final long serialVersionUID = -9200150586346868236L;

	Frame f;

	static String host = "localhost";

	// TextField con la entrada del usuario.
	TextField in = new TextField(50);

	// corresponde al TextArea donde se mostraran los mensajes recibidos
	// desde el servidor
	// DEBE ACTUALIZAR ESTA VARIABLE CUANDO LLEGA UN MENSAJE
	TextArea out = new TextArea(23, 15);

	// boton para enviar mensaje
	Button send = new Button("Enviar");

	// boton para cerrar el chat (el usuario sale del chat)
	Button end = new Button("Cerrar");

	// lista con los clientes conectados, corresponde a una lista de String
	List connected = new List();

	// nombre del usuario
	String minombre;
	
	Panel p = new Panel();
	ChatServidorInterface o;

	// constructor de la clase
	ChatCliente(String nombre) throws Exception {
		// titulo del frame AGREGAR NOMBRE DEL USUARIO
		f = new Frame("Chat "+nombre);
		
		this.minombre = nombre;
		Remote ro = Naming.lookup("rmi://localhost/chat");
		System.out.println("Servidor encontrado");
		o = (ChatServidorInterface) ro;
		
		// se va creando el frame
		o.agregarCliente(this);
		out.setEditable(false);
		f.setBackground(new Color(100, 100, 100));
		FlowLayout fl = new FlowLayout();
		fl.setVgap(20);
		p.setLayout(fl);
		p.add(in);
		p.add(send);
		p.add(end);
		BorderLayout gl = new BorderLayout();
		f.setLayout(gl);
		f.add(out, "Center");
		f.add(p, "South");
		
		f.add(connected, "East");
		send.addActionListener(this);
		end.addActionListener(this);
		in.addActionListener(this);
		f.setVisible(true);
		f.pack();
	}

	public void refrescarLista(String[] members) {
		connected.removeAll();
		for(int i = 0; i < members.length; i++){
			connected.add(members[i]);
		}
	}

	// maneja los botones de la interfaz
	public void actionPerformed(ActionEvent e) {
		try {
			if (e.getSource() == end) {
				// se selecciono el boton end
				o.borrarCliente(this);
				System.exit(1);
				
			} else {
				//  caso en que envia un mensaje
				o.enviarMensaje(in.getText(), this);
				in.setText("");
			}

		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}

	// main llama al constructor con variable de linea de comando
	static public void main(String args[]) throws Exception {
		if(args.length == 0) new ChatCliente("invitado_"+((int)(Math.random()*4000))); 
		else new ChatCliente(args[0]);
	}

	
	public String getNombre() throws RemoteException {
		// COMPLETAR METODO
		return minombre;
	}

	public void nuevoMensaje(String s) throws RemoteException {
		out.append(s+"\n");
	}

}